package main

import (
	"fmt"
	"log"

	"sysu-giep/internal/config"
	"sysu-giep/internal/database"
	"sysu-giep/internal/database/models"

	"gorm.io/gorm"
)

func main() {
	// 加载配置
	cfg, err := config.Load("configs/config.yaml")
	if err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}

	// 初始化数据库
	if err := database.Init(&cfg.Database); err != nil {
		log.Fatalf("初始化数据库失败: %v", err)
	}
	defer func() {
		if err := database.Close(); err != nil {
			log.Printf("关闭数据库连接失败: %v", err)
		}
	}()

	db := database.GetDB()

	// 执行私聊表迁移
	if err := migratePrivateChatTables(db); err != nil {
		log.Fatalf("迁移私聊表失败: %v", err)
	}

	fmt.Println("私聊表迁移完成！")
}

// migratePrivateChatTables 迁移私聊相关表
func migratePrivateChatTables(db *gorm.DB) error {
	fmt.Println("开始迁移私聊相关表...")

	// 自动迁移私聊相关模型
	err := db.AutoMigrate(
		&models.PrivateChat{},
		&models.PrivateMessage{},
	)
	if err != nil {
		return fmt.Errorf("自动迁移私聊表失败: %v", err)
	}

	fmt.Println("✓ 私聊会话表迁移完成")
	fmt.Println("✓ 私聊消息表迁移完成")

	// 创建索引
	if err := createPrivateChatIndexes(db); err != nil {
		return fmt.Errorf("创建私聊表索引失败: %v", err)
	}

	fmt.Println("✓ 私聊表索引创建完成")

	// 插入初始数据
	if err := insertInitialPrivateChatData(db); err != nil {
		return fmt.Errorf("插入初始私聊数据失败: %v", err)
	}

	fmt.Println("✓ 初始私聊数据插入完成")

	return nil
}

// createPrivateChatIndexes 创建私聊表索引
func createPrivateChatIndexes(db *gorm.DB) error {
	// 创建复合索引
	indexes := []string{
		"CREATE INDEX IF NOT EXISTS idx_private_messages_chat_sent_at ON private_messages (private_chat_id, sent_at DESC)",
		"CREATE INDEX IF NOT EXISTS idx_private_messages_sender_status ON private_messages (sender_id, status)",
		"CREATE INDEX IF NOT EXISTS idx_private_messages_chat_read_at ON private_messages (private_chat_id, read_at)",
		"CREATE INDEX IF NOT EXISTS idx_private_messages_type ON private_messages (type)",
		"CREATE INDEX IF NOT EXISTS idx_private_messages_status ON private_messages (status)",
		"CREATE INDEX IF NOT EXISTS idx_private_chats_last_message_at ON private_chats (last_message_at)",
	}

	for _, indexSQL := range indexes {
		if err := db.Exec(indexSQL).Error; err != nil {
			// 忽略索引已存在的错误
			fmt.Printf("创建索引时出现警告: %v\n", err)
		}
	}

	return nil
}

// insertInitialPrivateChatData 插入初始私聊数据
func insertInitialPrivateChatData(db *gorm.DB) error {
	// 这里可以插入一些系统默认的私聊配置数据
	// 例如：系统通知、欢迎消息等

	// 检查是否已有数据
	var count int64
	if err := db.Model(&models.PrivateChat{}).Count(&count).Error; err != nil {
		return err
	}

	if count > 0 {
		fmt.Println("私聊表已有数据，跳过初始数据插入")
		return nil
	}

	// 可以在这里添加系统默认私聊的创建逻辑
	// 例如：
	// systemChat := &models.PrivateChat{
	//     User1ID: systemUserID,
	//     User2ID: userID,
	//     IsActive: true,
	// }
	// if err := db.Create(systemChat).Error; err != nil {
	//     return err
	// }

	return nil
}

// 辅助函数：检查表是否存在
func tableExists(db *gorm.DB, tableName string) bool {
	var count int64
	err := db.Raw("SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?", tableName).Scan(&count).Error
	return err == nil && count > 0
}

// 辅助函数：检查索引是否存在
func indexExists(db *gorm.DB, tableName, indexName string) bool {
	var count int64
	err := db.Raw("SELECT COUNT(*) FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = ? AND index_name = ?", tableName, indexName).Scan(&count).Error
	return err == nil && count > 0
}

// 辅助函数：获取数据库版本信息
func getDatabaseInfo(db *gorm.DB) {
	var version string
	if err := db.Raw("SELECT VERSION()").Scan(&version).Error; err == nil {
		fmt.Printf("数据库版本: %s\n", version)
	}

	var charset string
	if err := db.Raw("SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = DATABASE()").Scan(&charset).Error; err == nil {
		fmt.Printf("数据库字符集: %s\n", charset)
	}
}

// 辅助函数：显示表结构信息
func showTableInfo(db *gorm.DB, tableName string) {
	fmt.Printf("\n=== %s 表结构 ===\n", tableName)

	var columns []struct {
		Field   string `json:"field"`
		Type    string `json:"type"`
		Null    string `json:"null"`
		Key     string `json:"key"`
		Default string `json:"default"`
		Extra   string `json:"extra"`
	}

	if err := db.Raw("DESCRIBE " + tableName).Scan(&columns).Error; err != nil {
		fmt.Printf("获取表结构失败: %v\n", err)
		return
	}

	for _, col := range columns {
		fmt.Printf("%-20s %-20s %-5s %-5s %-10s %s\n",
			col.Field, col.Type, col.Null, col.Key, col.Default, col.Extra)
	}
}

// 辅助函数：显示索引信息
func showIndexInfo(db *gorm.DB, tableName string) {
	fmt.Printf("\n=== %s 表索引 ===\n", tableName)

	var indexes []struct {
		KeyName    string `json:"key_name"`
		ColumnName string `json:"column_name"`
		NonUnique  int    `json:"non_unique"`
	}

	if err := db.Raw("SHOW INDEX FROM " + tableName).Scan(&indexes).Error; err != nil {
		fmt.Printf("获取索引信息失败: %v\n", err)
		return
	}

	for _, idx := range indexes {
		unique := "UNIQUE"
		if idx.NonUnique == 1 {
			unique = "INDEX"
		}
		fmt.Printf("%-20s %-20s %s\n", idx.KeyName, idx.ColumnName, unique)
	}
}
